package com.snif.web.attach.core.config;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;

import com.snif.web.attach.core.utils.LogUtils;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * JsonConfigReader
 *
 * @author Yakir
 */

public class JsonConfigReader {

	private static final String CONFIG_FILE_NAME = "method-config.json";

	private static Map<String, MethodConfig> methodConfigMap = new HashMap<>();

	public JsonConfigReader() {
		loadConfig();
	}

	private void loadConfig() {
		try {
			// 先尝试从外部文件系统读取
			File configFile = new File(CONFIG_FILE_NAME);
			if (!configFile.exists()) {
				FileUtil.writeUtf8String("[]", configFile);
			}
			if (configFile.exists() && configFile.canRead()) {
				try (FileReader reader = new FileReader(configFile)) {
					String jsonText = IoUtil.read(reader);
					registerMethod(jsonText);
				}
			}
			else {
				// 从类路径读取默认配置
				try (InputStream is = ResourceUtil.getStream(CONFIG_FILE_NAME)) {
					if (is != null) {
						String jsonText = IoUtil.readUtf8(is);
						registerMethod(jsonText);
					}
					else {
						throw new RuntimeException("配置文件不存在: " + CONFIG_FILE_NAME);
					}
				}
			}
		}
		catch (Exception e) {
			throw new RuntimeException("加载配置文件失败", e);
		}
	}

	private static void registerMethod(String jsonText) {
		if (StrUtil.isBlank(jsonText)) {
			return;
		}
		List<MethodConfig> methodConfigList = JSONUtil.toList(jsonText, MethodConfig.class);
		if (CollectionUtil.isNotEmpty(methodConfigList)) {
			methodConfigList.forEach(item -> {
				String key = item.getId() + "#" + item.getMethod();
				methodConfigMap.put(key, item);
				LogUtils.info("注册方法key:{}", key);

			});
		}
	}

	// 根据方法名和请求方式获取配置
	public MethodConfig getConfig(String id, String httpMethod) {
		return methodConfigMap.get(id + "#" + httpMethod);
	}

	// 重新加载配置
	public void reloadConfig() {
		loadConfig();
	}

}
